import axios from 'axios'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import store from '../store/index'

// 简单：创建axios的实例，实例和axios功能基本一致
const request = axios.create({
  baseURL: '/api', // 基础路径，发送请求地址组成：（baseURL + url）
  timeout: 10000 // 请求的超时时间，超过多久响应还没回来，就自动中断
})
const errorMessages = {
  401: '未授权',
  403: '禁止访问',
  404: '资源找不到',
  500: '服务器内部错误'
}

// 设置拦截器
// 请求拦截器
request.interceptors.request.use(
  // 成功回调（默认触发）
  config => {
    // config就是请求配置对象：里面包含请求地址、请求参数、请求头等请求信息
    NProgress.start() // 进度条开始
    // 必须返回config，返回的config就是发送请求的配置对象
    config.headers.token = store.state.user.token
    return config
  }
  // 失败回调（通常不会触发）
  // () => {}
)
// 响应拦截器
request.interceptors.response.use(
  // 成功回调（响应状态码2xx）
  response => {
    // 响应数据 - 直接就是需要data数据
    NProgress.done() // 进度条结束
    // 判断功能是否成功
    if (response.data.code === 200) {
      // 没有返回Promise，默认就是成功状态 --> 触发then
      // this.$message({
      //   message: '登录成功',
      //   type: 'success'
      // })
      // alert('成功')
      return response.data
    }
    NProgress.done()
    // 功能失败
    // 返回失败的Promise --> 触发catch
    return Promise.reject(response.data.message || '功能失败了~')
  },
  // 失败回调（响应状态码非2xx）
  error => {
    console.log(error) // timeout
    // console.log(error.message);
    NProgress.done() // 进度条结束

    /*
      error.response代表响应有没有回来
        有值：响应回来了
        没有值：响应没回来
    */
    // 响应回来了，响应失败的
    // 401 403 404 500
    if (error.response) {
      return Promise.reject(
        errorMessages[error.response.status] || '未知错误，请联系管理员解决'
      )
    }

    // 响应没有回来，以下错误，都是响应没有返回导致的错误
    if (error.message.indexOf('timeout') > -1) {
      // return Promise.reject("网络超时");
      return Promise.reject('您的网速太慢，请打开Wifi试试~')
    } else if (error.message.indexOf('Network Error') > -1) {
      return Promise.reject('断网了，请重新打开网络试试')
    } else {
      return Promise.reject('未知错误，请联系管理员解决')
    }
  }
)

export default request
